﻿/**
 * CHANGE LOG:
 * ```````````
 * 20140605-0510
 * # FIx lỗi: Khi lấy danh sách các câu hỏi để tạo đề thi, chỉ lấy những câu hỏi được đánh dấu là còn được sử dụng.
 * 
 * 20140423-1430
 * # Thay đổi TenDeThi thành STT-MaHocPhan.m1.m2.m3
 *   Khi sử dụng, có thể tuỳ biến thông tin này.
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyNganHangDe.BLL;
using QuanLyNganHangDe.DAL.Models;

namespace QuanLyNganHangDe.GUI.TacNghiep
{
    public partial class FormDotThi_Import : Form
    {
        /// <summary>
        /// Thông tin về học phần sẽ ra đề thi
        /// </summary>
        class HocPhanThi
        {
            public int SoThuTu { get; set; }
            public DateTime NgayThi { get; set; }
            public string NgayThiInString { get; set; }
            public string GioThi { get; set; }
            public string MaHocPhan { get; set; }

            public string TenHocPhan { get; set; }
            public int SoTinChi { get; set; }
            public int ThoiGianLamBai { get; set; }
            public bool DuocSuDungTaiLieu { get; set; }

            public string TrangThai { get; set; }
            public void SetInvalid(string trangThai)
            {
                IsValid = false;
                TrangThai = trangThai;
                SoTinChi = 0;
                ThoiGianLamBai = 0;
            }
            public bool IsValid { get; set; }

            public DeInRa DeSinhRa { get; set; }
        }

        private DotThi m_DotThi;
        private HocKy m_HocKy;
        private NamHoc m_NamHoc;
        private int m_SoChuSoSTT = 0;

        private QuanLyNganHangDe.DAL.Models.QLNHD_KHContext m_DbContext = null;
        private QuanLyNganHangDe.DAL.Models.QLNHD_KHContext DbContext
        {
            get
            {
                if (m_DbContext == null)
                    m_DbContext = QLNHD_KHContext.GetContext();
                return m_DbContext;
            }
        }

        private void ReleaseDbContext()
        {
            if (m_DbContext != null)
            {
                m_DbContext.Dispose();
            }
        }

        public FormDotThi_Import(DotThi dotThi, HocKy hocKy, NamHoc namHoc)
        {
            InitializeComponent();
            m_DotThi = dotThi;
            m_HocKy = hocKy;
            m_NamHoc = namHoc;
            lblHeader.Text = string.Format("     Nạp thông tin cho đợt thi {0} học kỳ {1} năm học {2}", dotThi.TenDotThi, hocKy.TenHocKy, namHoc.NamHoc1);
            bsHocPhanThi.DataSource = null;
        }

        private void lnkSelectFile_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var dlg = new OpenFileDialog();
            dlg.Title = "Chọn tệp Excel để nạp thông tin đợt thi...";
            dlg.Filter = "Tệp Excel (*.XLS)|*.xls";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtExcelFileName.Text = dlg.FileName;
                NapDanhSachBangTinh();
            }
        }

        private void lnkGetSheetList_Click(object sender, EventArgs e)
        {
            NapDanhSachBangTinh();
        }

        private void NapDanhSachBangTinh()
        {
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                //DialogUtils.ShowError("Bạn phải chọn tệp Excel chứa danh sách các học phần ra đề thi");
                //return;
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            try
            {
                var ei = new BLL.Excel.ExcelImporter(filename);
                var lstSheet = ei.GetSheetNameList();

                cbxSheet.Items.Clear();
                foreach (var sheet in lstSheet)
                    cbxSheet.Items.Add(sheet);

                if (lstSheet.Count > 0)
                {
                    cbxSheet.SelectedIndex = 0;
                    for (int idx = 1; idx < lstSheet.Count; idx++)
                    {
                        if (lstSheet[idx].FriendlyName.ToUpper() == "LICHTHI_M001")
                        {
                            cbxSheet.SelectedIndex = idx;
                            break;
                        }
                    }
                }
            }
            catch (Exception exc)
            {
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Không thể nạp danh sách bảng tính\r\n" + exc.Message);
            }
        }

        private DateTime getVNDateFromString(string stDateTime)
        {
            var info = stDateTime.Split('/');
            var day = Convert.ToInt32(info[0]);
            var month = Convert.ToInt32(info[1]);
            var year = Convert.ToInt32(info[2]);
            return new DateTime(year, month, day);
        }

        private void btnReadSheetData_Click(object sender, EventArgs e)
        {
            #region var ei = new ExcelImporter() or return;
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                //DialogUtils.ShowError("Bạn phải chọn tệp Excel chứa danh sách các học phần ra đề thi");
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            var ei = new BLL.Excel.ExcelImporter(filename);
            string sheetName = null;
            BLL.Excel.SheetName oSheetName = null;
            if (cbxSheet.SelectedItem != null)
                oSheetName = cbxSheet.SelectedItem as BLL.Excel.SheetName;
            if (oSheetName != null)
                sheetName = oSheetName.Name;
            if (string.IsNullOrEmpty(sheetName))
            {
                //DialogUtils.ShowError("Bạn phải chọn bảng tính chứa danh danh sách các học phần ra đề thi");
                ep.SetIconAlignment(lblSheetname, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblSheetname, "Bạn chưa chọn bảng tính");
                return;
            }
            #endregion

            try
            {
                var maxSTT = -1;
                var startCell = txtStartCell.Text;
                var endCell = txtEndCell.Text;
                var dt = ei.ReadData(sheetName, startCell, endCell, headerEnable: false);
                var lstHocPhanThi = new List<HocPhanThi>();
                foreach (DataRow drow in dt.Rows)
                {
                    var stSTT = Convert.ToString(drow[0]);
                    if (string.IsNullOrEmpty(stSTT))
                        break;

                    int stt;
                    try
                    {
                        stt = Convert.ToInt32(stSTT);
                    }
                    catch (Exception exc)
                    {
                        continue;
                    }
                    if (stt > maxSTT) maxSTT = stt;
                    var ngayThi = getVNDateFromString(Convert.ToString(drow[1]));
                    var gioThi = Convert.ToString(drow[2]);
                    var maHocPhan = Convert.ToString(drow[3]);
                    var hocPhanThi = new HocPhanThi()
                    {
                        SoThuTu = stt,
                        NgayThi = ngayThi,
                        NgayThiInString = ngayThi.ToString("dd/MM/yyyy"),
                        GioThi = gioThi,
                        MaHocPhan = maHocPhan
                    };

                    var hocphan = BizHocPhan.GetHocPhan(maHocPhan);
                    if (hocphan == null)
                    {
                        hocPhanThi.SetInvalid("Chưa có ngân hàng đề");
                        hocPhanThi.TenHocPhan = "???";
                    }
                    else
                    {
                        hocPhanThi.TenHocPhan = hocphan.TenHocPhan;
                        hocPhanThi.TenHocPhan = hocphan.TenHocPhan;
                        hocPhanThi.SoTinChi = hocphan.SoTinChi;
                        hocPhanThi.ThoiGianLamBai = hocphan.ThoiGianLamBai;
                        hocPhanThi.DuocSuDungTaiLieu = hocphan.DuocSuDungTaiLieu;

                        // Kiểm tra xem học phần này đã được ra đề thi chưa?
                        var nDeInRa = this.DbContext.DeInRaDbSet.Count(x => x.MaDotThi == this.m_DotThi.MaDotThi &&
                            x.MaHocPhan == maHocPhan && x.NgayThi == hocPhanThi.NgayThiInString && x.GioThi == gioThi);
                        if (nDeInRa > 0)
                        {
                            hocPhanThi.SetInvalid("Đã ra đề thi");
                        }
                        else
                        {
                            hocPhanThi.IsValid = true;
                        }
                    }

                    lstHocPhanThi.Add(hocPhanThi);
                }
                bsHocPhanThi.DataSource = new SortableBindingList<HocPhanThi>(lstHocPhanThi);
                gridHocPhanThi.AutoGenerateColumns = false;
                gridHocPhanThi.DataSource = bsHocPhanThi;
                if (maxSTT < 10)
                    m_SoChuSoSTT = 1;
                else if (maxSTT < 100)
                    m_SoChuSoSTT = 2;
                else if (maxSTT < 1000)
                    m_SoChuSoSTT = 3;
                else
                    m_SoChuSoSTT = 0;
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Xuất hiện lỗi trong quá trình đọc dữ liệu.\nChi tiết lỗi: " + exc);
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private string getSttString(int stt, int soChuSo)
        {
            var stResult = stt.ToString();
            while (stResult.Length < soChuSo)
                stResult = "0" + stResult;
            return stResult;
        }

        private const string EXC_CHUA_QUY_DINH_KHOI_NOI_DUNG_THI = "Chưa quy định khối nội dung thi trong ngân hàng đề";
        private const string EXC_DA_SINH_DE_THI_ROI = "Đã có đề thi";

        private void btnCreateDeInRa_Click(object sender, EventArgs eventArgs)
        {
            #region Kiểm tra tính hợp lệ của dữ liệu
            ep.Clear();
            if (bsHocPhanThi.DataSource == null)
            {
                ep.SetIconAlignment(btnCreateDeInRa, ErrorIconAlignment.MiddleLeft);
                ep.SetError(btnCreateDeInRa, "Chưa có dữ liệu");
                return;
            }
            #endregion

            #region Kiểm tra sự tồn tại của các tệp mẫu
            var stMauDeThi = System.IO.Path.Combine(Application.StartupPath, "TEMPLATE", "MauDeThi.rtf");
            if (System.IO.File.Exists(stMauDeThi) == false)
            {
                MessageBox.Show("Tệp mẫu đề thi " + stMauDeThi + " không tồn tại");
                return;
            }
            var stMauDapAn = System.IO.Path.Combine(Application.StartupPath, "TEMPLATE", "MauDapAn.rtf");
            if (System.IO.File.Exists(stMauDapAn) == false)
            {
                MessageBox.Show("Tệp mẫu đáp án" + stMauDeThi + " không tồn tại");
                return;
            }
            #endregion

            var bw = new BackgroundWorker() { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
            bw.DoWork += (oSender, oE) =>
            {
                #region DoWork
                #region Tạo thư mục tương ứng với Đợt thi
                bw.ReportProgress(0, (object)"Tạo thư mục chứa đề thi sinh ra...");
                string exeDirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string dataDirPath = System.IO.Path.Combine(exeDirPath, "DE");
                //string dataDirPath = Program.DeThiDirectoryPath;
                if (System.IO.Directory.Exists(dataDirPath) == false)
                    System.IO.Directory.CreateDirectory(dataDirPath);
                string dotThiDirPath = System.IO.Path.Combine(dataDirPath, m_DotThi.MaDotThi);
                if (System.IO.Directory.Exists(dotThiDirPath) == false)
                    System.IO.Directory.CreateDirectory(dotThiDirPath);
                #endregion

                var context = this.DbContext;
                var lstHocPhanThi = oE.Argument as SortableBindingList<HocPhanThi>;

                #region Assign SttKhoi (nếu cần thiết)
                bw.ReportProgress(0, "Chuẩn hoá dữ liệu...");
                bool hasAssigned = false;
                for (int k = 0; k < lstHocPhanThi.Count; k++)
                {
                    var hocPhanThi = lstHocPhanThi[k];
                    var lstKhoiThi = context.KhoiDbSet.Where(e => e.MaHocPhan == hocPhanThi.MaHocPhan).ToList();
                    if (lstKhoiThi.Count > 0)
                    {
                        foreach (var khoi in lstKhoiThi)
                        {
                            if (khoi.Stt == 0)
                            {
                                for (int stt = 100; stt > 0; stt--)
                                    if (khoi.TenKhoi.Contains(string.Format(" {0}.", stt)))
                                    {
                                        khoi.Stt = stt;
                                        hasAssigned = true;
                                        break; //for stt
                                    }
                            }
                        }
                    }
                }
                if (hasAssigned)
                    context.SaveChanges();
                #endregion

                #region Tạo dữ liệu
                bw.ReportProgress(-1, "Tạo dữ liệu...");
                var frm = new Form() { Text = "", ControlBox = false, ShowInTaskbar = false, FormBorderStyle = System.Windows.Forms.FormBorderStyle.None, Size = new Size(1, 1), Location = new Point(-50, -50), StartPosition = FormStartPosition.Manual, TopMost = false };
                var pnlParent = new Panel();
                frm.Controls.Add(pnlParent);
                frm.Show();
                #endregion

                #region Sinh ra n đề thi
                var n = lstHocPhanThi.Count;
                for (int k = 0; k < n; k++)
                {
                    if (bw.CancellationPending)
                        break;
                    bw.ReportProgress(0, string.Format("Xử lý dòng {0}/{1}...", k + 1, n));
                    FormDeThi_ChiTiet.writeLog("{0}/{1}", k + 1, n);
                    var hocPhanThi = lstHocPhanThi[k];

                    #region Tạo đề thi cho hocPhanThi
                    try
                    {
                        #region var hocPhan = ...
                        var hocPhan = context.HocPhanDbSet.Where(e => e.MaHocPhan == hocPhanThi.MaHocPhan).FirstOrDefault();
                        if (hocPhan == null)
                            throw new Exception("Không tìm thấy học phần");
                        #endregion

                        #region kiểm tra để bảo đảm chưa ra đề thi cho (ngày, giờ, học phần) này
                        var nDethi = this.DbContext.DeInRaDbSet.Where(e =>
                                            e.NgayThi == hocPhanThi.NgayThiInString &&
                                                //e.MaDotThi == m_DotThi.MaDotThi &&
                                            e.GioThi == hocPhanThi.GioThi &&
                                            e.MaHocPhan == hocPhanThi.MaHocPhan).Count();
                        if (nDethi > 0)
                            throw new Exception(EXC_DA_SINH_DE_THI_ROI);
                        #endregion

                        #region var lstKhoiThi = Khối câu hỏi của học phần;
                        var lstKhoiThi = context.KhoiDbSet.Where(e => e.MaHocPhan == hocPhanThi.MaHocPhan)
                                            .OrderBy(e => e.Stt).ToList();
                        if (lstKhoiThi.Count == 0)
                            throw new Exception(EXC_CHUA_QUY_DINH_KHOI_NOI_DUNG_THI);
                        #endregion

                        #region var de = new DeInRa(){...};
                        var de = new DeInRa();
                        de.MaDotThi = m_DotThi.MaDotThi;
                        de.MaDeThi = System.Guid.NewGuid().ToString();
                        de.NgayThi = hocPhanThi.NgayThi.ToString("dd/MM/yyyy");
                        de.GioThi = hocPhanThi.GioThi;
                        de.ThoiGianLamBai = hocPhanThi.ThoiGianLamBai;
                        de.DuocSuDungTaiLieu = hocPhanThi.DuocSuDungTaiLieu;
                        de.MaHocPhan = hocPhanThi.MaHocPhan;
                        de.TenDangNhap = Program.NguoiSuDung.TenDangNhap;
                        de.HocPhan = hocPhan;
                        #endregion

                        #region de.CauHoiCollection = bốc ngẫu nhiên các câu hỏi trong các khối;
                        FormDeThi_ChiTiet.writeLog("chọn ngẫu nhiên các câu hỏi...");
                        var tenDeThi = new StringBuilder();
                        tenDeThi.AppendFormat("{0}-{1}",
                            //hocPhanThi.NgayThi.ToString("yyyyMMdd"),
                            //hocPhanThi.GioThi,
                            getSttString(hocPhanThi.SoThuTu, m_SoChuSoSTT),
                            hocPhanThi.MaHocPhan);

                        for (int stt = 0; stt < lstKhoiThi.Count; stt++)
                        {
                            var khoi = lstKhoiThi[stt];

                            #region CauHoi cauHoiChon = bốc ngẫu nhiên câu hỏi cho khối <khoi>;
                            CauHoi cauHoiChon = null;

                            #region var lstCauHoi = danh sách câu hỏi của khối;
                            var lstCauHoi = context.CauHoiDbSet.Include("DeInRaCollection").Where(e =>
                                                    e.MaKhoi == khoi.MaKhoi && e.ConSuDung).ToList();
                            if (lstCauHoi.Count == 0)
                                throw new Exception(string.Format("Không có câu hỏi cho nội dung của khối [{0}]", khoi.TenKhoi));
                            #endregion

                            #region var min = số đề thi nhỏ nhất có chứa câu hỏi thuộc khối này
                            var min = int.MaxValue;
                            foreach (var cauHoi in lstCauHoi)
                            {
                                var soLanSuDung = cauHoi.DeInRaCollection.Count;
                                if (soLanSuDung < min)
                                    min = soLanSuDung;
                            }
                            #endregion

                            #region var nMin = số lượng câu hỏi có số lần sử dụng là min
                            var nMin = 0;
                            foreach (var cauHoi in lstCauHoi)
                                if (cauHoi.DeInRaCollection.Count == min)
                                    nMin++;
                            #endregion

                            if (nMin < lstCauHoi.Count / 2)
                            {
                                #region chỉ dùng các câu hỏi đã khai thác được min lần
                                for (int i = lstCauHoi.Count - 1; i >= 0; i--)
                                    if (lstCauHoi[i].DeInRaCollection.Count > min)
                                        lstCauHoi.RemoveAt(i);
                                #endregion
                            }

                            // Randomly select a question from the final list of question
                            var randomize = new Random((int)System.DateTime.Now.Ticks);
                            var idxCauHoi = randomize.Next(0, lstCauHoi.Count - 1);
                            cauHoiChon = lstCauHoi[idxCauHoi];
                            #endregion

                            if (cauHoiChon == null)
                                throw new Exception(string.Format("Không thể chọn câu hỏi cho khối {0} được", khoi.TenKhoi));
                            var maSoCauHoi = cauHoiChon.TenCauHoi.ToUpper().Replace("CÂU", "").Replace(" ", "");
                            var idxDot = maSoCauHoi.IndexOf(".");
                            if (idxDot >= 0 && idxDot < maSoCauHoi.Length)
                                maSoCauHoi = maSoCauHoi.Substring(idxDot + 1);
                            tenDeThi.AppendFormat(".{0}", maSoCauHoi);

                            de.CauHoiCollection.Add(cauHoiChon);
                        }

                        de.TenDeThi = tenDeThi.ToString();
                        hocPhanThi.TrangThai = tenDeThi.ToString();
                        FormDeThi_ChiTiet.writeLog("\tđã chọn xong");
                        #endregion

                        #region de.NoiDungDeThi = ...;
                        FormDeThi_ChiTiet.writeLog("call GetNoiDungDeThi");
                        var rtfcodeNoiDungDeThi = FormDeThi_ChiTiet.GetNoiDungDeThi(pnlParent, de, m_HocKy, m_NamHoc, context, needToLoadDetailDataOfDeInRa: false);
                        de.WriteNoiDungDeThi(rtfcodeNoiDungDeThi);
                        #endregion

                        #region de.NoiDungDapAn = ...;
                        try
                        {
                            var dapanRtfCode = FormDeThi_ChiTiet.GetNoiDungDapAn(pnlParent, de, m_HocKy, m_NamHoc, context, needToLoadDetailDataOfDeInRa: false);
                            if (string.IsNullOrEmpty(dapanRtfCode))
                                dapanRtfCode = "";

                            de.WriteNoiDungDapAn(dapanRtfCode);
                        }
                        catch { }
                        #endregion

                        FormDeThi_ChiTiet.writeLog("\tdone for call GetNoiDungDeThi");

                        context.DeInRaDbSet.Add(de);
                        context.SaveChanges();
                        hocPhanThi.DeSinhRa = de;

                        FormDeThi_ChiTiet.writeLog("\tdone for save dethi to db");
                    }
                    catch (Exception exc)
                    {
                        #region handling error exc
                        if (exc.Message == EXC_DA_SINH_DE_THI_ROI || exc.Message == EXC_CHUA_QUY_DINH_KHOI_NOI_DUNG_THI)
                        {
                            hocPhanThi.TrangThai = exc.Message;
                        }
                        else
                        {
                            var sbError = new StringBuilder();
                            sbError.AppendFormat("{0}\r\n{1}", exc.Message, exc.StackTrace);
                            int nError = 0;
                            while (exc.InnerException != null)
                            {
                                nError++;
                                if (nError > 100)
                                    break;
                                exc = exc.InnerException;
                                sbError.AppendFormat("\r\n----------\r\n{0}\r\n{1}", exc.Message, exc.StackTrace);
                            }
                            hocPhanThi.TrangThai = string.Format("Lỗi: {0}: {1}", exc.Message, sbError.ToString());
                        }
                        FormDeThi_ChiTiet.writeLog("\tLỗi " + hocPhanThi.TrangThai);
                        #endregion
                    }
                    #endregion
                }
                #endregion
                FormDeThi_ChiTiet.writeLog("OOOOOOOOOOK");

                frm.Close();
                frm.Dispose();
                frm = null;
                #endregion
            };
            bw.RunWorkerCompleted += (oSender, oE) =>
            {
                #region RunWorkerCompleted
                UpdateGuiAsFree();
                if (oE.Cancelled)
                    DialogUtils.ShowMessage("Quá trình tạo đề thi bị huỷ ngang.\nCó thể có một số đề thi đã được tạo ra trên hệ thống.");
                #endregion
            };
            bw.ProgressChanged += (oSender, oE) =>
            {
                #region ProgressChanged
                lblProgress.Text = oE.UserState.ToString();

                if (oE.ProgressPercentage == -1)
                {
                }
                else
                    gridHocPhanThi.Refresh();
                #endregion
            };

            UpdateGuiAsBusy(bw);
            bw.RunWorkerAsync(bsHocPhanThi.DataSource);
        }

        private void UpdateGuiAsBusy(BackgroundWorker bw)
        {
            btnCreateDeInRa.Text = "Huỷ ngang";
            btnCreateDeInRa.Tag = bw;
            btnSaveDeInRa.Enabled = false;
            btnClose.Enabled = false;
            pnlProgress.Visible = true;
        }

        private void UpdateGuiAsFree()
        {
            btnCreateDeInRa.Text = "Tạo đề thi";
            btnCreateDeInRa.Tag = null;
            btnSaveDeInRa.Enabled = true;
            btnClose.Enabled = true;
            pnlProgress.Visible = false;
        }

        private DataGridViewCellStyle m_StrikeoutStyle = null;
        private DataGridViewCellStyle StrikeoutStyle
        {
            get
            {
                if (m_StrikeoutStyle == null)
                {
                    m_StrikeoutStyle = new DataGridViewCellStyle(gridHocPhanThi.DefaultCellStyle);
                    m_StrikeoutStyle.Font = new Font(m_StrikeoutStyle.Font, FontStyle.Strikeout);
                    m_StrikeoutStyle.ForeColor = Color.Gray;
                }
                return m_StrikeoutStyle;
            }
        }

        private void gridHocPhanThi_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < gridHocPhanThi.Rows.Count; i++)
            {
                DataGridViewRow dgrow = gridHocPhanThi.Rows[i];
                var hocPhanThi = dgrow.DataBoundItem as HocPhanThi;
                if (hocPhanThi.IsValid)
                {
                    for (int j = 1; j <= 6; j++)
                        dgrow.Cells[j].Style = null;
                }
                else
                {
                    for (int j = 1; j <= 6; j++)
                        dgrow.Cells[j].Style = StrikeoutStyle;
                }
            }
        }

        private void buttonExportGrid2Excel_Click(object sender, EventArgs e)
        {
            gridHocPhanThi.ExportFilePath = "TaoDeThi-LOG.xls";
            gridHocPhanThi.ToExcel(exportVisibleColumnsOnly: true);
        }

        private void btnSaveDeInRa_Click(object sender, EventArgs ea)
        {
            #region Kiểm tra tính hợp lệ của dữ liệu
            ep.Clear();
            if (bsHocPhanThi.DataSource == null)
            {
                ep.SetIconAlignment(btnCreateDeInRa, ErrorIconAlignment.MiddleLeft);
                ep.SetError(btnCreateDeInRa, "Chưa có dữ liệu");
                return;
            }
            #endregion

            var lstHocPhanThi = bsHocPhanThi.DataSource as SortableBindingList<HocPhanThi>;
            if (lstHocPhanThi == null)
                return;
            var context = this.DbContext;

            var nSaved = 0;
            foreach (var hocPhanThi in lstHocPhanThi)
            {
                var trangthai = hocPhanThi.TrangThai;
                if (trangthai == null || trangthai.StartsWith("Lỗi: "))
                    continue;

                try
                {
                    #region Kiểm tra xem học phần này đã ra đề thi hay chưa
                    var n = this.DbContext.DeInRaDbSet.Where(e =>
                        e.NgayThi == hocPhanThi.NgayThiInString &&
                        e.GioThi == hocPhanThi.GioThi &&
                        e.MaHocPhan == hocPhanThi.MaHocPhan &&
                        e.MaDotThi == m_DotThi.MaDotThi
                        ).Count();
                    if (n > 0)
                        throw new Exception("Đã tồn tại đề thi trên hệ thống");
                    #endregion

                    var deSinhRa = hocPhanThi.DeSinhRa;
                    context.DeInRaDbSet.Add(deSinhRa);
                    context.SaveChanges();
                    nSaved++;
                }
                catch (Exception exc)
                {
                    var st = string.Format("Xuất hiện lỗi khi lưu đề {0} ({1}).\nChi tiết lỗi: {2}", hocPhanThi.TenHocPhan, hocPhanThi.MaHocPhan, exc.Message);
                    DialogUtils.ShowError(st);
                }
            }

            DialogUtils.ShowMessage(string.Format("Đã lưu {0}/{1} đề vào hệ thống", nSaved, lstHocPhanThi.Count));
        }

        private void FormDotThi_Import_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.ReleaseDbContext();
        }
    }
}
